package com.lovo.project.util;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

public class Jiexi {
   public static List<LinkedHashMap<String, Object>> xlsxImportExcel(InputStream file, Integer titleNo, Integer dataNo, Integer sheetNo) throws IOException, IOException {
//        log.info("excel2007及以上版本");
        // 读取流中的excel数据 这里用到的是poi中的XSSFWorkbook 用来处理xlsx(版本在2007以后的excel文件) HSSFWorkbook对象用来处理xls类型 版本为2003的文件
        XSSFWorkbook xwb = new XSSFWorkbook(file); //获取excel工作簿
        XSSFSheet xssfSheet = xwb.getSheetAt(sheetNo); //获取excel的sheet
        if (xssfSheet == null) {
            return null;
        }
        // 防止数据列错乱
        List<LinkedHashMap<String, Object>> mapList = new ArrayList<>();
        Row rowTitle = xssfSheet.getRow(titleNo);
        //循环获取excel每一行
        for (int rowNum = dataNo; rowNum < xssfSheet.getLastRowNum() + 1; rowNum++) {
            XSSFRow xssfRow = xssfSheet.getRow(rowNum);
            if (xssfRow == null) {
                continue;
            }
            LinkedHashMap<String, Object> map = new LinkedHashMap<>();
            //循环获取excel每一行的每一列
            for (int cellNum = 0; cellNum < rowTitle.getLastCellNum(); cellNum++) {
                XSSFCell xssCell = xssfRow.getCell(cellNum);
                if (xssCell == null) {
                    // 防止单元格为空
                    map.put(rowTitle.getCell(cellNum).toString(), "");
                    continue;
                }
                try {
                    map.put(rowTitle.getCell(cellNum).toString(), getXSSFValue(xssCell));
                } catch (Exception e) {
//                    log.error("");
                }
            }
            mapList.add(map);  //将excel每一行的数据封装到map对象,并将map对象添加到list
        }
        return mapList;
    }

    public static Object getXSSFValue(XSSFCell hssfCell) {
        Object result = null;
        int cellType = hssfCell.getCellType();
        switch (hssfCell.getCellType()) {
            case HSSFCell.CELL_TYPE_NUMERIC: //数字
                if (HSSFDateUtil.isCellDateFormatted(hssfCell)) {
//                    需要对日期这一列进行设置样式，否则无法识别是日期类型还是数值类型
//                    默认不支持中文日期类型，需要设置成纯英语日期类型，不要包含年月日等汉字
//                    最好是使用这种格式 2019/10/10 0:00
                    SimpleDateFormat sdf = new SimpleDateFormat(
                            "yyyy-MM-dd HH:mm:ss");
                    result = sdf.format(HSSFDateUtil.getJavaDate(hssfCell.getNumericCellValue()));
                    break;
                }
                result = hssfCell.getNumericCellValue();
                break;
            case HSSFCell.CELL_TYPE_BOOLEAN: //Boolean
                result = hssfCell.getBooleanCellValue();
                break;
            case HSSFCell.CELL_TYPE_ERROR: //故障
                result = hssfCell.getErrorCellValue();
                break;
            case HSSFCell.CELL_TYPE_FORMULA: //公式
                result = hssfCell.getCellFormula();
                break;
            case HSSFCell.CELL_TYPE_BLANK:
                result = "";
                break;
            default: //字符串
                result = hssfCell.getStringCellValue();
        }
        return result;
    }
}
